package pe.com.bbva.modpre.ui;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.ExcepcionDuracionCf;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.utileria.Inject;
import pe.com.bbva.modpre.utileria.ModpreUtil;
import pe.com.bbva.modpre.utileria.TablaFiltro;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.terminal.gwt.server.WebBrowser;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class AdministrarExcepcionDuracionUI extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout lytExcepcionFormulario;
	@AutoGenerated
	private HorizontalLayout lytBotonera;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private TextField txtAsignarPlazo;
	@AutoGenerated
	private TextField txtMenorOIgual;
	@AutoGenerated
	private TextField txtMayorOIgual;
	@AutoGenerated
	private TextField txtMoneda;
	@AutoGenerated
	private TextField txtCodigoProducto;
	@AutoGenerated
	private VerticalLayout lytExcepcion;
	@AutoGenerated
	private Panel pnlExcepcion;
	@AutoGenerated
	private VerticalLayout lytPanelExcepcion;
	@AutoGenerated
	private TablaFiltro tblExcepcion;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	@Autowired
	SolicitudService solicitudService;
	
	IndexedContainer container;	
	
	public AdministrarExcepcionDuracionUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		Inject.inject(this);
		postConstruct();
	}
	
	@Override
	public void attach() {
		super.attach();
		WebApplicationContext context = ((WebApplicationContext) getApplication().getContext());
		WebBrowser webBrowser = context.getBrowser();
		tblExcepcion.setWebBrowser(webBrowser);
		container=new IndexedContainer();
		
		container.addContainerProperty("codigoProducto", String.class, null);
		container.addContainerProperty("moneda", String.class, null);
		container.addContainerProperty("mayorOIgual", BigDecimal.class, null);
		container.addContainerProperty("menorOIgual", BigDecimal.class, null);
		container.addContainerProperty("asignarPlazo", BigDecimal.class, null);
		container.addContainerProperty("excepcion", ExcepcionDuracionCf.class, null);
		tblExcepcion.setContainerDataSource(container);
		
		tblExcepcion.setVisibleColumns(new Object[]{"codigoProducto","moneda","mayorOIgual","menorOIgual",
				"asignarPlazo"});
		
		tblExcepcion.setColumnHeader("codigoProducto", "Codigo Producto");
		tblExcepcion.setColumnHeader("moneda", "Cod. Moneda");
		tblExcepcion.setColumnHeader("mayorOIgual", "Mayor o Igual");
		tblExcepcion.setColumnHeader("menorOIgual", "Menor o Igual");
		tblExcepcion.setColumnHeader("asignarPlazo", "Asignar Plazo");
		
		tblExcepcion.setColumnWidth("codigoProducto", 80);
		tblExcepcion.setColumnWidth("moneda", 80);
		tblExcepcion.setColumnWidth("mayorOIgual", 80);
		tblExcepcion.setColumnWidth("menorOIgual", 80);
		tblExcepcion.setColumnWidth("asignarPlazo", 80);
		tblExcepcion.setSelectable(true);
		tblExcepcion.setImmediate(true);
		tblExcepcion.setNullSelectionAllowed(true);
		tblExcepcion.setNullSelectionItemId(null);
		tblExcepcion.setColumnReorderingAllowed(false);
		tblExcepcion.setColumnCollapsingAllowed(false);
		tblExcepcion.cargarTabla();
		tblExcepcion.addListener(new ValueChangeListener() {
			
			@Override
			public void valueChange(ValueChangeEvent event) {
				if(tblExcepcion.getValue() == null){
					limpiar();
				}
				else
				{
					btnGuardar.setCaption("Actualizar");
					btnEliminar.setVisible(true);
					Item item = tblExcepcion.getItem(tblExcepcion.getValue());
					ExcepcionDuracionCf excepcion=(ExcepcionDuracionCf)item.getItemProperty("excepcion").getValue();
					txtCodigoProducto.setValue(excepcion.getCodigoProducto());
					txtMoneda.setValue(excepcion.getMoneda());
					txtMayorOIgual.setValue(excepcion.getMayorOIgual());
					txtMenorOIgual.setValue(excepcion.getMenorOIgual());
					txtAsignarPlazo.setValue(excepcion.getAsignarPlazo());
				}
			}
		});
		cargarDataTabla(null);
	}

	public void postConstruct(){
		lytPanelExcepcion.setSizeUndefined();
		lytPanelExcepcion.setHeight("100%");
		
		txtCodigoProducto.setNullRepresentation(StringUtils.EMPTY);
		txtMoneda.setNullRepresentation(StringUtils.EMPTY);
		txtMayorOIgual.setNullRepresentation(StringUtils.EMPTY);
		txtMayorOIgual.setStyleName("numerico");
		txtMenorOIgual.setNullRepresentation(StringUtils.EMPTY);
		txtMenorOIgual.setStyleName("numerico");
		txtAsignarPlazo.setNullRepresentation(StringUtils.EMPTY);
		txtAsignarPlazo.setStyleName("numerico");
		
		btnGuardar.addListener(this);
		btnEliminar.addListener(this);
		btnEliminar.setVisible(false);
		
	}

	public void cargarDataTabla(Map<String,Object> map){
		tblExcepcion.removeAllItems();
		
		List<ExcepcionDuracionCf> excepciones=solicitudService.buscarExcepcionDuracionCfs(map);
		
		int con=1;
		for(ExcepcionDuracionCf excepcion : excepciones){
			Item item = container.addItem(con);
			item.getItemProperty("codigoProducto").setValue(excepcion.getCodigoProducto());
			item.getItemProperty("moneda").setValue(excepcion.getMoneda());
			item.getItemProperty("mayorOIgual").setValue(excepcion.getMayorOIgual());
			item.getItemProperty("menorOIgual").setValue(excepcion.getMenorOIgual());
			item.getItemProperty("asignarPlazo").setValue(excepcion.getAsignarPlazo());
			item.getItemProperty("excepcion").setValue(excepcion);
			con++;	
		}
	}
	
	public void limpiar(){
		btnEliminar.setVisible(false);
		btnGuardar.setCaption("Crear");
		txtCodigoProducto.setValue(null);
		txtMoneda.setValue(null);
		txtMayorOIgual.setValue(null);
		txtMenorOIgual.setValue(null);
		txtAsignarPlazo.setValue(null);
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar))
		{
			buttonGuardar();
		}
		if(event.getButton().equals(btnEliminar))
		{
			buttonEliminar();
		}
	}
	
	private void buttonGuardar() {
		Item item = tblExcepcion.getItem(tblExcepcion.getValue());
		ExcepcionDuracionCf excepcion = new ExcepcionDuracionCf();
		if(item!=null){
			excepcion=(ExcepcionDuracionCf)item.getItemProperty("excepcion").getValue();
		}
		excepcion.setCodigoProducto((String)txtCodigoProducto.getValue());
		excepcion.setMoneda((String)txtMoneda.getValue());
		excepcion.setMayorOIgual(ModpreUtil.convertirObjetoBigDecimal(txtMayorOIgual.getValue()));
		excepcion.setMenorOIgual(ModpreUtil.convertirObjetoBigDecimal(txtMenorOIgual.getValue()));
		excepcion.setAsignarPlazo(ModpreUtil.convertirObjetoBigDecimal(txtAsignarPlazo.getValue()));
		
		solicitudService.guardarExcepcionDuracionCf(excepcion);
		limpiar();
		cargarDataTabla(null);
	}
	
	private void buttonEliminar() {
		Item item = tblExcepcion.getItem(tblExcepcion.getValue());
		ExcepcionDuracionCf excepcion=(ExcepcionDuracionCf)item.getItemProperty("excepcion").getValue();
		solicitudService.eliminarExcepcionDuracionCf(excepcion.getId());
		limpiar();
		cargarDataTabla(null);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(false);
		
		// lytExcepcion
		lytExcepcion = buildLytExcepcion();
		mainLayoutContainer.addComponent(lytExcepcion);
		
		// lytExcepcionFormulario
		lytExcepcionFormulario = buildLytExcepcionFormulario();
		mainLayoutContainer.addComponent(lytExcepcionFormulario);
		
		return mainLayoutContainer;
	}

	@AutoGenerated
	private VerticalLayout buildLytExcepcion() {
		// common part: create layout
		lytExcepcion = new VerticalLayout();
		lytExcepcion.setImmediate(false);
		lytExcepcion.setWidth("-1px");
		lytExcepcion.setHeight("-1px");
		lytExcepcion.setMargin(false);
		
		// pnlExcepcion
		pnlExcepcion = buildPnlExcepcion();
		lytExcepcion.addComponent(pnlExcepcion);
		
		return lytExcepcion;
	}

	@AutoGenerated
	private Panel buildPnlExcepcion() {
		// common part: create layout
		pnlExcepcion = new Panel();
		pnlExcepcion.setImmediate(false);
		pnlExcepcion.setWidth("750px");
		pnlExcepcion.setHeight("450px");
		
		// lytPanelExcepcion
		lytPanelExcepcion = buildLytPanelExcepcion();
		pnlExcepcion.setContent(lytPanelExcepcion);
		
		return pnlExcepcion;
	}

	@AutoGenerated
	private VerticalLayout buildLytPanelExcepcion() {
		// common part: create layout
		lytPanelExcepcion = new VerticalLayout();
		lytPanelExcepcion.setImmediate(false);
		lytPanelExcepcion.setWidth("100.0%");
		lytPanelExcepcion.setHeight("100.0%");
		lytPanelExcepcion.setMargin(false);
		
		// tblExcepcion
		tblExcepcion = new TablaFiltro(){
			
			@Override
			public void enter() {
				cargarDataTabla(tblExcepcion.obtenerFiltros());
			}
			
		};
		tblExcepcion.setImmediate(false);
		tblExcepcion.setWidth("100.0%");
		tblExcepcion.setHeight("100.0%");
		lytPanelExcepcion.addComponent(tblExcepcion);
		lytPanelExcepcion.setExpandRatio(tblExcepcion, 1.0f);
		
		return lytPanelExcepcion;
	}

	@AutoGenerated
	private VerticalLayout buildLytExcepcionFormulario() {
		// common part: create layout
		lytExcepcionFormulario = new VerticalLayout();
		lytExcepcionFormulario.setImmediate(false);
		lytExcepcionFormulario.setWidth("-1px");
		lytExcepcionFormulario.setHeight("-1px");
		lytExcepcionFormulario.setMargin(true);
		lytExcepcionFormulario.setSpacing(true);
		
		// txtCodigoProducto
		txtCodigoProducto = new TextField();
		txtCodigoProducto.setImmediate(false);
		txtCodigoProducto.setWidth("200px");
		txtCodigoProducto.setHeight("-1px");
		txtCodigoProducto.setInputPrompt("Codigo Producto");
		lytExcepcionFormulario.addComponent(txtCodigoProducto);
		
		// txtMoneda
		txtMoneda = new TextField();
		txtMoneda.setImmediate(false);
		txtMoneda.setWidth("200px");
		txtMoneda.setHeight("-1px");
		txtMoneda.setInputPrompt("Moneda");
		lytExcepcionFormulario.addComponent(txtMoneda);
		
		// txtMayorOIgual
		txtMayorOIgual = new TextField();
		txtMayorOIgual.setImmediate(false);
		txtMayorOIgual.setWidth("200px");
		txtMayorOIgual.setHeight("-1px");
		txtMayorOIgual.setInputPrompt("Mayor o Igual");
		lytExcepcionFormulario.addComponent(txtMayorOIgual);
		
		// txtMenorOIgual
		txtMenorOIgual = new TextField();
		txtMenorOIgual.setImmediate(false);
		txtMenorOIgual.setWidth("200px");
		txtMenorOIgual.setHeight("-1px");
		txtMenorOIgual.setInputPrompt("Menor o Igual");
		lytExcepcionFormulario.addComponent(txtMenorOIgual);
		
		// txtAsignarPlazo
		txtAsignarPlazo = new TextField();
		txtAsignarPlazo.setImmediate(false);
		txtAsignarPlazo.setWidth("200px");
		txtAsignarPlazo.setHeight("-1px");
		txtAsignarPlazo.setInputPrompt("Asignar Plazo");
		lytExcepcionFormulario.addComponent(txtAsignarPlazo);
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		lytExcepcionFormulario.addComponent(lytBotonera);
		
		return lytExcepcionFormulario;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("-1px");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(false);
		lytBotonera.setSpacing(true);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Crear");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytBotonera.addComponent(btnGuardar);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(true);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		lytBotonera.addComponent(btnEliminar);
		
		return lytBotonera;
	}

}
